package br.com.cast.view.notaFiscal;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import br.com.cast.exception.NotaFiscalCadastrada;
import br.com.cast.modelo.NotaFiscal;
import br.com.cast.modelo.Produto;
import br.com.cast.service.INotaFiscalService;
import br.com.cast.service.IProdutoService;

public class FormNotaFiscal extends Form<NotaFiscal> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@SpringBean
	private INotaFiscalService iNotaFiscalService;

	@SpringBean
	private IProdutoService iProdutoService;

	private Produto produtoSelecionado;

	private WebMarkupContainer panel;

	private NotaFiscal notaFiscal;

	public FormNotaFiscal(String id) {
		super(id);

		notaFiscal = new NotaFiscal();

		setDefaultModel(new CompoundPropertyModel<>(notaFiscal));

		criarCampoNumero();

		criarComboProduto();

		criarLinkCancelar();

		criaListView();

	}

	private void criaListView() {

		panel = new WebMarkupContainer("panelGrade");
		panel.setOutputMarkupId(true);

		ListView<Produto> listView = new ListView<Produto>("produtosNF",
				notaFiscal.getProdutos()) {

			/**
					 * 
					 */
			private static final long serialVersionUID = 1L;

			@Override
			protected void populateItem(ListItem<Produto> item) {

				final Produto p = (Produto) item.getDefaultModelObject();
				if (item.getIndex() % 2 != 0) {

					item.add(AttributeModifier.replace("class", "alt"));
				}

				item.add(new Label("descricao", p.getDescricao()));

				item.add(new AjaxLink<Void>("excluir") {

					/**
					 * 
					 */
					private static final long serialVersionUID = 1L;

					@Override
					public void onClick(AjaxRequestTarget target) {
						notaFiscal.getProdutos().remove(p);
						target.add(panel);
					}
				});
			}

		};

		listView.setOutputMarkupId(true);
		panel.add(listView);
		add(panel);

	}

	private void criarCampoNumero() {
		add(new RequiredTextField<>("numero"));
	}

	@SuppressWarnings("rawtypes")
	private void criarLinkCancelar() {

		add(new Link("cancelar") {
			private static final long serialVersionUID = 1L;

			@Override
			public void onClick() {
				// redirecionaListar();
			}
		});

	}

	private void criarComboProduto() {

		IChoiceRenderer<Produto> renderer = new ChoiceRenderer<>("descricao");

		// }
		ListModel<Produto> model = new ListModel<>(
				iProdutoService.consultaTodos());

		final DropDownChoice<Produto> produto = new DropDownChoice<Produto>(
				"produtos", new PropertyModel<Produto>(this,
						"produtoSelecionado"), model, renderer);
		produto.add(new AjaxFormComponentUpdatingBehavior("change") {

			/**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			@Override
			protected void onUpdate(AjaxRequestTarget target) {
				// verifica se há um produto valido selecionado no comboBox
				if (produtoSelecionado == null) {
					return;
				}
				notaFiscal.getProdutos().add(produtoSelecionado);
				target.add(panel);
			}
		});
		add(produto);
	}

	@Override
	protected void onSubmit() {
		NotaFiscal notaFiscal = (NotaFiscal) getDefaultModelObject();

		try {
			iNotaFiscalService.salvar(notaFiscal);
			// HomePage template = redirecionaListar();
			// template.success("Registro inserido com sucesso!");
		} catch (NotaFiscalCadastrada e) {
			error(e.getMessage());
		}
	}

	// private HomePage redirecionaListar() {
	// HomePage template = ComponentUtil.getTemplate(this);
	// template.replace(new ListarNotaFiscal(HomePage.conteudo));
	// return template;
	// }

}
